package cn.tedu.tickets;
/**需求：设计多线程模型，4个售票窗口共计售票100张
 * 本方案使用多线程编程实现方案2：实现Runnable来完成*/
public class TestRunnable {
    public static void main(String[] args) {
        Tickets tickets = new Tickets();

        Thread t1 = new Thread(tickets);
        Thread t2 = new Thread(tickets);
        Thread t3 = new Thread(tickets);
        Thread t4 = new Thread(tickets);
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }

}
//1.自定义多线程类实现Runnable接口
class Tickets implements Runnable{
   //3.定义变量，保存票数
    /**由于自定义类对象，作为唯一的业务对象，只new了一次
     * 自定义类对象只创建了一次
     * 所以发布的任务，也就是票数天然的会被所有线程对象共享，无需设置为静态也只有一份*/
    int ticket = 100;

    //2.添加父接口中未实现的方法，里面是我们自己的业务
    @Override
    public void run() {
        /**让每个线程经历休眠，增加线程状态切换的频率与出错的概率，产生了问题：
         * 问题1：产生了重卖的现象：同一张票卖给了多个人
         * 问题2：产生了超卖的现象，超出了规定的票数，出现了0  -1  -2这样的票*/
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //4.循环卖票
        while (true){
            System.out.println(Thread.currentThread().getName()+"="+ticket--);

            if (ticket <= 0) break;

        }

    }
}
